/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.siscoh.controller;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.siscoh.model.bean.UsuarioBean;
import org.siscoh.model.dao.UsuarioDao;

/**
 *
 * @author Israel
 */
public class ControladorUsuario extends AbstractController {

    @Override
    public String executa(HttpServletRequest request, HttpServletResponse response) {
        String codigo, url = "";
        int acao;

        codigo = request.getParameter("cod");

        if (codigo == null || codigo.equals("")) {
            return null;
        }

        acao = Integer.parseInt(codigo);

        switch (acao) {
            case Constants.LOGIN:
                url = verificarLogin(request, response);
                break;
            case Constants.ALTERAR_DADOS:
                url = irParaAlterarDados(request, response);
                break;
            case Constants.CHANGE:
                url = updateUsuario(request, response);
                break;
            case Constants.LOGOFF:
                url = fazerLogoff(request, response);
                break;
            case Constants.INSERT_USUARIO:
                url = cadastrarUsuario(request, response);
                break;
        }

        return url;
    }
    
    private String updateUsuario(HttpServletRequest request, HttpServletResponse response)
    {
        String url = "formularios/formusuario?status=";
        String param, nome, login, senha, novaSenha, confSenha, adminStr;
        
        boolean ignorarSenha = true;
        
        param = request.getParameter("userid");
        nome = request.getParameter("nome");
        login = request.getParameter("novologin");
        senha = request.getParameter("oldsenha");
        novaSenha = request.getParameter("senha");
        confSenha = request.getParameter("confsenha");
        adminStr = request.getParameter("admin");
        
        if(param == null || param.equals(""))
        {
            return null;
        }
        
        HttpSession session = request.getSession();
        
        if(session == null)
        {
            return null;
        }
        
        UsuarioBean logado = (UsuarioBean) session.getAttribute("user");
        
        long userId = Long.parseLong(param);
        
        UsuarioBean usuario = (UsuarioBean) new UsuarioDao().selectById(userId);
        
        if(logado == null || usuario == null || nome == null || nome.equals("") || login == null ||
                login.equals(""))
        {
            return url+"0";
        }
        
        if(logado.getId() == usuario.getId())
        {
            //Se a nova senha não for vazia, significa que deseja trocar de senha:
            if(novaSenha != null && !novaSenha.equals(""))
            {
                ignorarSenha = false;
                if(senha == null || senha.equals("") || confSenha == null || confSenha.equals("") ||
                  !usuario.getSenha().equals(encriptarSenha(senha)) || !novaSenha.equals(confSenha))
                {
                    System.err.println("---------------------------------------------------");
                    System.err.println("Verificação 02");
                    System.err.println("---------------------------------------------------");
                    System.err.println("Senha DB: "+usuario.getSenha());
                    System.err.println("Senha OLD: "+encriptarSenha(senha));
                    
                    if(usuario.getSenha().equals(encriptarSenha(senha)))
                        System.err.println("IGUAIS!");
                    else
                        System.err.println("DIFERENTES!");
                    
                    System.err.println("\nNova senha: "+novaSenha);
                    System.err.println("Conf senha: "+confSenha);
                    
                    if(novaSenha.equals(confSenha))
                        System.err.println("IGUAIS!");
                    else
                        System.err.println("DIFERENTES!");
                    
                    System.err.println("---------------------------------------------------");
                    return url+"0";
                }
            }
        }
        else if(novaSenha != null && !novaSenha.equals(""))
        {
            ignorarSenha = false;
        }
        
        usuario.setLogin(login);
        usuario.setNome(nome);
        
        if(adminStr != null && !adminStr.equals(""))
            usuario.setAdministrador(Boolean.parseBoolean(adminStr));
        
        if(!ignorarSenha)
            usuario.setSenha(encriptarSenha(novaSenha));
        
        new UsuarioDao().update(usuario);
        
        return url+"1";
    }
    
    private String irParaAlterarDados(HttpServletRequest request, HttpServletResponse response)
    {
        String url = "formularios/formusuario?userid=";
        UsuarioBean user = null;
        
        HttpSession sessao = request.getSession();
        
        if(sessao == null || sessao.getAttribute("user") == null || request.getParameter("userid") == null
                || request.getParameter("userid").equals(""))
        {
            url = "403.html";
        }
        else
        {
            user = (UsuarioBean) sessao.getAttribute("user");
            
            long userId = Long.parseLong(request.getParameter("userid"));
            
            if(user.getId() != userId && !user.isAdministrador())
            {
                return "403.html";
            }
            
            url += userId;
        }
        
        return url;
    }

    private String cadastrarUsuario(HttpServletRequest request, HttpServletResponse response) {
        String url = "formularios/formusuario?status=";

        String nome, login, senha, confSenha, adminStr;

        nome = request.getParameter("nome");
        login = request.getParameter("novologin");
        senha = request.getParameter("senha");
        confSenha = request.getParameter("confsenha");

        adminStr = request.getParameter("admin");

        if (nome == null || login == null || senha == null || confSenha == null
                || nome.equals("") || login.equals("") || senha.equals("") || confSenha.equals("")
                || (!senha.equals(confSenha))) {
            return url + "0";
        } else {
            UsuarioBean usuario = new UsuarioBean();

            usuario.setNome(nome);
            usuario.setLogin(login);
            usuario.setAdministrador(Boolean.parseBoolean(adminStr));
            usuario.setSenha(encriptarSenha(senha));

            new UsuarioDao().insert(usuario);
        }

        return url+"1";
    }

    private String fazerLogoff(HttpServletRequest request, HttpServletResponse response) {

        HttpSession session = request.getSession();
        if (session != null) {
            session.invalidate();
        }

        return "";
    }

    private String verificarLogin(HttpServletRequest request, HttpServletResponse response) {
        String url = "?login=";

        String login, senha, senhaEncr;
        login = request.getParameter("nome");
        senha = request.getParameter("senha");

        senhaEncr = encriptarSenha(senha);

        UsuarioBean ub = new UsuarioDao().verificarLogin(login, senhaEncr);

        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }

        if (ub == null) {
            return url + "0";
        }

        session = request.getSession(true);
        session.setAttribute("user", ub);

        System.err.println("Retuning = " + url + "1");

        return url + "1";
    }

    private String encriptarSenha(String senha) {
        try {
            MessageDigest md = MessageDigest.getInstance("sha-256");
            md.update(senha.getBytes());

            return binToHex(md.digest());
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace(System.err);
            return senha;
        }
    }

    private String binToHex(byte[] byteData) {
        StringBuffer sb = new StringBuffer();

        for (int i = 0; i < byteData.length; i++) {
            sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
        }

        return sb.toString();
    }
}